package br.com.consultsystems.dominio.financeiro;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;

import br.com.consultsystems.dominio.cadastro.Condominio;
import br.com.consultsystems.dominio.cadastro.Imovel;

@Entity
@Table(name = "caixabanco")
@SequenceGenerator(name = "operacao", sequenceName = "operacao",  allocationSize = 1)
@XmlRootElement
public class CaixaBanco implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 4234335669161970462L;

	@Id
	@Column(name = "id", nullable = false, insertable = true, updatable = false)
	@GeneratedValue(generator = "operacao", strategy = GenerationType.SEQUENCE)
	private Long id;

	@ManyToOne
	@JoinColumn(name = "id_baixa", nullable = false, insertable = true, updatable = false)
	private Baixa baixa;	
	
	@ManyToOne
	@JoinColumn(name = "id_conta", nullable = false, insertable = true, updatable = false)
	private Conta conta;	
	
	@ManyToOne
	@JoinColumn(name = "id_condominio", nullable = false, insertable = true, updatable = false)
	private Condominio condominio;	

	@ManyToOne
	@JoinColumn(name = "id_historico_caixabanco", nullable = false, insertable = true, updatable = false)
	private Historico historicoCaixaBanco;	

	@ManyToOne
	@JoinColumn(name = "id_fechamento", nullable = true, insertable = true, updatable = false)
	private Fechamento fechamento;	
	
	@Column(name = "datamovimento", nullable = false, insertable = true, updatable = false)
	@Temporal(TemporalType.DATE)
	private Date dataMovimento;

	@Column(name = "valorlancamento", nullable = false, insertable = true, updatable = false)
	private BigDecimal valorLancamento;
	
	@Column(name = "observacao", nullable = true, insertable = true, updatable = false)
	private String observacao;

	@ManyToOne
	@JoinColumn(name = "id_balancete", nullable = true, insertable = true, updatable = false)
	private Balancete balancete;	

	@ManyToOne
	@JoinColumn(name = "id_historico_balancete", nullable = true, insertable = true, updatable = false)
	private Historico historicoBalancete;	

	@ManyToOne
	@JoinColumn(name = "id_imovel", nullable = true, insertable = true, updatable = false)
	private Imovel imovel;	
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Baixa getBaixa() {
		return baixa;
	}

	public void setBaixa(Baixa baixa) {
		this.baixa = baixa;
	}

	public Conta getConta() {
		return conta;
	}

	public void setConta(Conta conta) {
		this.conta = conta;
	}

	public Condominio getCondominio() {
		return condominio;
	}

	public void setCondominio(Condominio condominio) {
		this.condominio = condominio;
	}

	public Fechamento getFechamento() {
		return fechamento;
	}

	public void setFechamento(Fechamento fechamento) {
		this.fechamento = fechamento;
	}

	public Date getDataMovimento() {
		return dataMovimento;
	}

	public void setDataMovimento(Date dataMovimento) {
		this.dataMovimento = dataMovimento;
	}

	public BigDecimal getValorLancamento() {
		return valorLancamento;
	}

	public void setValorLancamento(BigDecimal valorLancamento) {
		this.valorLancamento = valorLancamento;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	public Balancete getBalancete() {
		return balancete;
	}

	public void setBalancete(Balancete balancete) {
		this.balancete = balancete;
	}

	public Historico getHistoricoCaixaBanco() {
		return historicoCaixaBanco;
	}

	public void setHistoricoCaixaBanco(Historico historicoCaixaBanco) {
		this.historicoCaixaBanco = historicoCaixaBanco;
	}

	public Historico getHistoricoBalancete() {
		return historicoBalancete;
	}

	public void setHistoricoBalancete(Historico historicoBalancete) {
		this.historicoBalancete = historicoBalancete;
	}

	public Imovel getImovel() {
		return imovel;
	}

	public void setImovel(Imovel imovel) {
		this.imovel = imovel;
	}

	@Override
	public String toString() {
		return "CaixaBanco [id=" + id + ", baixa=" + baixa + ", conta=" + conta
				+ ", condominio=" + condominio + ", historicoCaixaBanco="
				+ historicoCaixaBanco + ", fechamento=" + fechamento
				+ ", dataMovimento=" + dataMovimento + ", valorLancamento="
				+ valorLancamento + ", observacao=" + observacao
				+ ", balancete=" + balancete + ", historicoBalancete="
				+ historicoBalancete + ", imovel=" + imovel + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		CaixaBanco other = (CaixaBanco) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}	
	
}
